<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>Explain详解 | 叫我华仔~</title>
    <meta name="description" content="Write the Code. Change the world">
    <link rel="shortcut icon" type="image/x-icon" href="https://tva1.sinaimg.cn/large/0060lm7Tly1g4lrkxbno3j30go0gogm9.jpg">
    
    <link rel="preload" href="/assets/css/0.styles.cd3776eb.css" as="style"><link rel="preload" href="/assets/js/app.48b22e4d.js" as="script"><link rel="preload" href="/assets/js/2.3fdd559a.js" as="script"><link rel="preload" href="/assets/js/6.80a92dc6.js" as="script"><link rel="prefetch" href="/assets/js/10.e1dd09fa.js"><link rel="prefetch" href="/assets/js/11.4aed7e88.js"><link rel="prefetch" href="/assets/js/12.82f25f15.js"><link rel="prefetch" href="/assets/js/13.0fee9ac6.js"><link rel="prefetch" href="/assets/js/14.12b766db.js"><link rel="prefetch" href="/assets/js/15.867ab787.js"><link rel="prefetch" href="/assets/js/3.378e0b39.js"><link rel="prefetch" href="/assets/js/4.3e162dee.js"><link rel="prefetch" href="/assets/js/5.3b714238.js"><link rel="prefetch" href="/assets/js/7.f7efdc2b.js"><link rel="prefetch" href="/assets/js/8.a13d01b5.js"><link rel="prefetch" href="/assets/js/9.2299158f.js">
    <link rel="stylesheet" href="/assets/css/0.styles.cd3776eb.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">叫我华仔~</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/nodejs/JavaScript/JavaScript面试题大全.html" class="nav-link">Nodejs</a></div><div class="nav-item"><a href="/database/mysql/Explain详解.html" class="nav-link">Database</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Linux-Deploy</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/" class="nav-link">Linux</a></li><li class="dropdown-item"><!----> <a href="/linux-deploy/docker/优化docker打包速度和体积.html" class="nav-link">Docker</a></li></ul></div></div><div class="nav-item"><a href="/tools/Blog推荐.html" class="nav-link">Tools</a></div><div class="nav-item"><a href="/user/me.html" class="nav-link">关于我</a></div><div class="nav-item"><a href="https://github.com/zwhgithub" target="_blank" rel="noopener noreferrer" class="nav-link external">
  Github
  <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/nodejs/JavaScript/JavaScript面试题大全.html" class="nav-link">Nodejs</a></div><div class="nav-item"><a href="/database/mysql/Explain详解.html" class="nav-link">Database</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">Linux-Deploy</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/" class="nav-link">Linux</a></li><li class="dropdown-item"><!----> <a href="/linux-deploy/docker/优化docker打包速度和体积.html" class="nav-link">Docker</a></li></ul></div></div><div class="nav-item"><a href="/tools/Blog推荐.html" class="nav-link">Tools</a></div><div class="nav-item"><a href="/user/me.html" class="nav-link">关于我</a></div><div class="nav-item"><a href="https://github.com/zwhgithub" target="_blank" rel="noopener noreferrer" class="nav-link external">
  Github
  <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav>  <ul class="sidebar-links"><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>Mysql</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/database/mysql/Explain详解.html" class="active sidebar-link">Explain详解</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/database/mysql/Mysql索引最佳攻略.html" class="sidebar-link">Mysql索引最佳攻略</a></li><li><a href="/database/mysql/Mysql一些记不住的.html" class="sidebar-link">Mysql一些记不住的</a></li></ul></section></li></ul> </aside> <main class="page"> <div class="theme-default-content content__default"><h3 id="explain-详解"><a href="#explain-详解" aria-hidden="true" class="header-anchor">#</a> Explain 详解</h3> <p>使用EXPLAIN关键字可以模拟优化器执行SQL查询语句，从而知道MySQL是如何处理你的SQL语句。分析你的查询预付或表结构的性能瓶颈。</p> <h3 id="查询结果返回字段分析："><a href="#查询结果返回字段分析：" aria-hidden="true" class="header-anchor">#</a> 查询结果返回字段分析：</h3> <h4 id="_1、id列"><a href="#_1、id列" aria-hidden="true" class="header-anchor">#</a> 1、id列</h4> <p>select查询的序列号，包含一组数字，表示查询中执行select子句或操作表的顺序。id如果相同，可以认为是一个分组，从上往下顺序执行。id不同，id值越大，优先级越高，越先执行。</p> <h4 id="_2、select-type列"><a href="#_2、select-type列" aria-hidden="true" class="header-anchor">#</a> 2、select_type列</h4> <p>查询的类型，主要用于区别普通查询、联合查询、子查询等的复杂查询。</p> <table><thead><tr><th>id</th> <th>select_type</th> <th>ramark</th></tr></thead> <tbody><tr><td>1</td> <td>SIMPLE</td> <td>简单的select查询，查询中不包含子查询或UNION</td></tr> <tr><td>2</td> <td>PRIMARY</td> <td>复杂查询中最外层的 select</td></tr> <tr><td>3</td> <td>SUBQUERY</td> <td>在SELECT或WHERE列表中包含了子查询</td></tr> <tr><td>4</td> <td>DERIVED</td> <td>包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中，也称为派生表（derived的英文含义）</td></tr> <tr><td>5</td> <td>UNION</td> <td>若第二个SELECT出现在UNION之后，则被标记为UNION; 若UNION包含在FROM子句的子查询中，外层SELECT将被标记为：DERIVED</td></tr> <tr><td>6</td> <td>UNION RESULT</td> <td>从UNION表获取结果的SELECT</td></tr></tbody></table> <h4 id="_3、table列"><a href="#_3、table列" aria-hidden="true" class="header-anchor">#</a> 3、table列</h4> <p>表示查询涉及的表或衍生表。
注意：MySQL对待这些表和普通表一样，但是这些“临时表”是没有任何索引的。</p> <h4 id="_4、type列"><a href="#_4、type列" aria-hidden="true" class="header-anchor">#</a> 4、type列</h4> <div class="tip custom-block"><p>type显示的是访问类型，是较为重要的一个指标，结果值从好到坏依次是：一般来说，得保证查询至少达到range级别，最好能达到const。</p></div> <table><thead><tr><th>type</th> <th>说明</th></tr></thead> <tbody><tr><td>All</td> <td>最坏的情况, 全表扫描</td></tr> <tr><td>index</td> <td>和ALL一样，不同就是mysql只需扫描索引树，这通常比ALL快一些</td></tr> <tr><td>range</td> <td>范围扫描通常出现在 in(), between , &gt; , &lt;, &gt;= 等操作中。使用一个索引来检索给定范围的行</td></tr> <tr><td>ref</td> <td>不使用唯一索引，而是使用普通索引或者唯一性索引的部分前缀，索引要和某个值相比较，可能会找到多个符合条件的行</td></tr> <tr><td>eq_ref</td> <td>primary key 或 unique key 索引的所有部分被连接使用 ，最多只会返回一条符合条件的记录。这可能是在 const 之外最好的联接类型了</td></tr> <tr><td>const</td> <td>表示通过索引一次就找到了, const用于比较primary key或者unique索引。因为只匹配一行数据，所以很快。如将主键置于where列表中，MySQL就能将该查询转换为一个常量</td></tr> <tr><td>system</td> <td>表中只有一条数据. 这个类型是特殊的 <code>const</code> 类型</td></tr></tbody></table> <h4 id="_5、possible-keys列"><a href="#_5、possible-keys列" aria-hidden="true" class="header-anchor">#</a> 5、possible_keys列</h4> <p>表示 MySQL 在查询时, 能够使用到的索引. 注意, 即使有些索引在 possible_keys 中出现, 但是并不表示此索引会真正地被 MySQL 使用到. MySQL 在查询时具体使用了哪些索引, 由 key 字段决定。</p> <h4 id="_6、key列"><a href="#_6、key列" aria-hidden="true" class="header-anchor">#</a> 6、key列</h4> <div class="tip custom-block"><p>此字段是 MySQL 在当前查询时所真正使用到的索引。</p></div> <h4 id="_7、key-len列"><a href="#_7、key-len列" aria-hidden="true" class="header-anchor">#</a> 7、key_len列</h4> <ul><li>表示索引中使用的字节数，可通过该列计算查询中使用的索引的长度，key_len显示的值为索引字段的最大可能长度，并非实际使用长度，即key_len是根据表定义计算而得，不是通过表内检索出的。</li> <li>EXPLAIN执行计划中有一列 key_len 用于表示本次查询中，所选择的索引长度有多少字节，通常我们可借此判断联合索引有多少列被选择了。</li></ul> <div class="language- line-numbers-mode"><pre class="language-text"><code>字符串
char(n): n 字节长度
varchar(n): 如果是 utf8mb4 编码, 则是 4n + 2 字节, 如果是 utf8 编码, 则是 3n + 2 字节;

数值类型:
    TINYINT: 1 字节
SMALLINT: 2 字节
MEDIUMINT: 3 字节
INT: 4 字节
BIGINT: 8 字节

时间类型
DATE: 3 字节
TIMESTAMP: 4 字节
DATETIME: 8 字节
字段属性: NULL 属性 占用一个字节.如果一个字段是 NOT NULL 的, 则没有此属性.
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br></div></div><h4 id="_8、rows列"><a href="#_8、rows列" aria-hidden="true" class="header-anchor">#</a> 8、rows列</h4> <p>这一列是mysql估计要读取并检测的行数，这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好，注意这个不是结果集里的行数。</p> <h4 id="_9、extra列"><a href="#_9、extra列" aria-hidden="true" class="header-anchor">#</a> 9、Extra列</h4> <blockquote><p>这一列展示的是额外信息。常见的重要值如下：</p></blockquote> <ul><li>Using temporary 查询有使用临时表, 一般出现于排序, 分组和多表 join 的情况, 查询效率不高, 建议优化。</li> <li>Using index &quot;覆盖索引扫描&quot;, 表示查询在索引树中就可查找所需数据, 不用扫描表数据文件, 往往说明性能不错。</li> <li>Using filesort 当 Extra 中有 Using filesort 时, 表示 MySQL 需额外的排序操作, 不能通过索引顺序达到排序效果. 一般有 Using filesort, 都建议优化去掉, 因为这样的查询 CPU 资源消耗大。</li></ul></div> <footer class="page-edit"><!----> <!----></footer> <div class="page-nav"><p class="inner"><!----> <span class="next"><a href="/database/mysql/Mysql索引最佳攻略.html">
          Mysql索引最佳攻略
        </a>
        →
      </span></p></div> </main></div><div class="global-ui"></div></div>
    <script src="/assets/js/app.48b22e4d.js" defer></script><script src="/assets/js/2.3fdd559a.js" defer></script><script src="/assets/js/6.80a92dc6.js" defer></script>
  </body>
</html>
